package mistic.storage;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import com.sun.xml.internal.messaging.saaj.packaging.mime.util.BASE64DecoderStream;
import com.sun.xml.internal.messaging.saaj.packaging.mime.util.BASE64EncoderStream;

public class Storage {

	private static final String PRUEBA1_TXT = "data.txt";
	/**
	 * Dado un usuario obtiene el registro o retorna null en caso de que no lo encuentre
	 * 
	 * @param usuario
	 * @return
	 */
	public static Registro obtenerRegistro(String usuario) {
		byte[] bufferClave = new byte[64];
		byte[] bufferSalt = new byte[64];
		StringBuffer str = new StringBuffer();
		Registro reg = null;
		try {
			File file = new File(PRUEBA1_TXT);
			DataInputStream entrada = new DataInputStream(
					new BufferedInputStream(new FileInputStream(file)));
			BASE64DecoderStream b = new BASE64DecoderStream(entrada);
			byte[] bufferClaveHash = new byte[((int) file.length() + 1)];
			int t = b.read(bufferClaveHash);
			int k = 0;
			for (int i = 0; i < bufferClaveHash.length; i++) {
				//Esto es para tomar el valor del hash de la clave
				if (i < 64 + k)
					bufferClave[i - k] = bufferClaveHash[i];
				//Esto es el valor del Salt
				if (i >= 64 + k && i < 128 + k)
					bufferSalt[i - 64 - k] = bufferClaveHash[i];
				//Este seria el resto de los valores que tiene 
				if (i >= 128 + k) {
					str.append((char) bufferClaveHash[i]);
				}
				//Esto es el corte de contro, lo hice asi por que no podia leer lineas completas 
				if ((bufferClaveHash[i] == "\r".getBytes()[0])
						&& (bufferClaveHash[i + 1] == "\n".getBytes()[0])) {
					k = i + 2;
					i = i + 1;
					//this.parserUsuarioFalloRol(str.toString().trim());
					//Esto es para saber si el registro pertenece al tipo usuario ingresado o no
					if ((str.toString().trim().split(",")[1]).equals(usuario)) {
						reg = new Registro(bufferClave, bufferSalt,
								str.toString());
						break;
					}
					str = new StringBuffer();
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		return reg;
	}
	/**
	 * Esta funcion es la encargada de persistir en un archivo  los siguientes datos
	 * @param usuario
	 * @param claveHash
	 * @param salt
	 * @param roles
	 */
	public static void generarRegistro(String usuario, byte[] claveHash,byte[] salt, String roles) {
		byte[] fallos = "0".getBytes();
		byte[] sep = ",".getBytes();

		try {
			//Esto es para crear el stream de datos y el resto es para grabar en Base64
			DataOutputStream salida = new DataOutputStream(
					new BufferedOutputStream(new FileOutputStream(PRUEBA1_TXT,true)));
			BASE64EncoderStream output = new BASE64EncoderStream(salida);
			output.write(claveHash);
			output.write(salt);
			output.write(fallos);
			output.write(sep);
			output.write(usuario.getBytes());
			output.write(sep);
			output.write(roles.getBytes());
			output.write("\r\n".getBytes());
			output.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static void incrementarFallo(String usuario) {
		StringBuffer str = new StringBuffer();
		try {
			File file = new File(PRUEBA1_TXT);
			
			DataInputStream entrada = new DataInputStream(
					new BufferedInputStream(new FileInputStream(file)));
			BASE64DecoderStream b = new BASE64DecoderStream(entrada);

			byte[] bufferClaveHash = new byte[((int) file.length() + 1)];
			int t = b.read(bufferClaveHash);
			int k = 0;
			int valorIncrementar =0;
			int posicion =0;
			for (int i = 0; i < bufferClaveHash.length; i++) {
				
				if (i >= 128 + k) {

					str.append((char) bufferClaveHash[i]);
				}
				if (i == (128 + k)) {
					valorIncrementar =(int) bufferClaveHash[i];
					posicion  = (128 + k);
				}
				//Esto es el corte de contro, lo hice asi por que no podia leer lineas completas 
				if ((bufferClaveHash[i] == "\r".getBytes()[0])
						&& (bufferClaveHash[i + 1] == "\n".getBytes()[0])) {
					k = i + 2;
					i = i + 1;
					//this.parserUsuarioFalloRol(str.toString().trim());
					//Esto es para saber si el registro pertenece al tipo usuario ingresado o no
					if ((str.toString().trim().split(",")[1]).equals(usuario)) {
						
						DataOutputStream salida = new DataOutputStream(
								new BufferedOutputStream(new FileOutputStream(PRUEBA1_TXT)));
						BASE64EncoderStream output = new BASE64EncoderStream(salida);
						bufferClaveHash[posicion] = (byte) (valorIncrementar + 1);
						output.write(bufferClaveHash);
						output.close();
						
						break;
					}
					str = new StringBuffer();
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}
